home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / FILEMANA.D < prev    next >
Encoding:
Modula Definition  |  1990-10-24  |  10.3 KB  |  217 lines

  1. DEFINITION MODULE FileManagement;
  2. (*$H+*)
  3.  
  4. (*  System              : Megamax Modula-2 (MOS 2.0)
  5.  *  Author & Copyright  : Manuel Chakravarty
  6.  *  Vertrieb            : Application Systems Heidelberg
  7.  *  Version             : 1.0                   V#0018
  8.  *)
  9.  
  10.  
  11. (*  Dieses Modul stellt Routinen für die Dateiverwaltung zur Verfügung.
  12.  *
  13.  *  In allen auftretenden Listen müssen die Listenelemente null-
  14.  *  terminierte Zeichenketten sein, die einen Pfad-/Dateinamen enthalten.
  15.  *
  16.  *  Alle an die Parameter zu übergebenden Prozeduren dürfen auch lokal sein!
  17.  *)
  18.  
  19.  
  20. FROM Lists      IMPORT List;
  21. FROM Directory  IMPORT DirEntry;
  22. FROM MOSGlobals IMPORT drvA, drvB;
  23.  
  24.  
  25. TYPE    (*  Meldet dem Klienten den aktuellen Status (normalerweise die
  26.          *  Anzahl der Dateien, die noch bearbeitet werden müssen) und
  27.          *  erlaubt ihm durch zurückliefern von 'stop = TRUE' den Vorgang
  28.          *  abzubrechen.
  29.          *)
  30.         FileOpStatusProc    = PROCEDURE (    (*status: *) CARDINAL,
  31.                                          VAR (*stop  : *) BOOLEAN );
  32.  
  33.         (*  Dient zum Anzeigen einer der in 'MOSGlobals' definierten
  34.          *  Dateifehler.
  35.          *)
  36.         FileErrorAlertProc  = PROCEDURE ( (*errNo: *) INTEGER);
  37.  
  38.  
  39. PROCEDURE CountFilesAndDirs (REF path: ARRAY OF CHAR;
  40.                                  l   : List;
  41.                              VAR no  : CARDINAL);
  42.  
  43.         (*  Ermittelt die Anzahl der Ordner und Dateien, die durch eine
  44.          *  Liste aus Dateinamen bestimmt werden.
  45.          *
  46.          *  Dabei wird vor jeden Namen in der Liste 'l' noch der Pfad
  47.          *  'path' gehängt.
  48.          *)
  49.  
  50. PROCEDURE DeleteFiles (REF path        : ARRAY OF CHAR;
  51.                            files       : List;
  52.                            noFiles     : CARDINAL;
  53.                            showStatus  : FileOpStatusProc;
  54.                            fileErrAlert: FileErrorAlertProc);
  55.  
  56.         (*  Lösche Dateien und Ordner.
  57.          *
  58.          *  Es werden alle in 'files' angegebenen Dateien und Ordner ge-
  59.          *  löscht. Soll ein Ordner gelöscht werden, so werden vorher alle
  60.          *  darin enthaltenen Dateien und Ordner gelöscht. Vor jeden Pfad-
  61.          *  namen in 'files' wird noch der Pfad 'path' gehängt. Default-Lauf-
  62.          *  werk und Pfad werden nicht berücksichtigt.
  63.          *
  64.          *  Eingabeparameter
  65.          *  ----------------
  66.          *
  67.          *    'path'         -- Pfad mit dem alle Dateien beginnen, die
  68.          *                      gelöscht werden sollen. Path muß mit
  69.          *                      einem Laufwerk beginnen.
  70.          *    'files'        -- Liste aller zu löschenden Ordner und Da-
  71.          *                      eien. Jedem Listenelement wird noch 'path'
  72.          *                      vorangestellt.
  73.          *    'noFiles'      -- Anzahl der zu löschenden Ordner und Da-
  74.          *                      teien (kann mit 'CountFilesAndDirs be-
  75.          *                      stimmt werden) oder '0'.
  76.          *    'showStatus'   -- Diese Prozedur wird nach jedem Löschvor-
  77.          *                      gang mit der Anzahl der noch zu löschen-
  78.          *                      den Dateien aufgerufen und kann den Lösch-
  79.          *                      vorgang durch zurückliefern von 'stop =
  80.          *                      TRUE' abbrechen. Damit die Anzahl richtig
  81.          *                      ermittelt werden kann darf 'noFiles' nicht
  82.          *                      mit '0' aufgerufen werden.
  83.          *    'fileErrAlert' -- Diese Prozedur wird beim Auftretten eines
  84.          *                      Dateifehlers mit der entsprechenden Fehler-
  85.          *                      nummer aufgerufen.
  86.          *)
  87.  
  88.  
  89. TYPE    (*  Dient dazu dem Klienten zu melden, daß eine Datei gleichen
  90.          *  Namens schon existiert.
  91.          *  Es kann nun in 'name' ein anderer Name geliefert werden oder
  92.          *  das Kopieren dieser einen Datei durch Rückgabe von 'FALSE'
  93.          *  unterbunden werden.
  94.          *)
  95.         FileExistsAlertProc = PROCEDURE (VAR (*name: *) ARRAY OF CHAR): BOOLEAN;
  96.         
  97. PROCEDURE CopyFiles (REF path        : ARRAY OF CHAR;
  98.                          fileList    : List;
  99.                          noFiles     : CARDINAL;
  100.                      REF newPath     : ARRAY OF CHAR;
  101.                          deleteOld,
  102.                          useAllMem   : BOOLEAN;
  103.                          feAlert     : FileExistsAlertProc;
  104.                          showStatus  : FileOpStatusProc;
  105.                          fileErrAlert: FileErrorAlertProc);
  106.  
  107.         (*  Kopiere Dateien und Ordner.
  108.          *
  109.          *  Es werden alle in 'files' angegebenen Dateien und Ordner ko-
  110.          *  piert. Wird ein Ordner kopiert, so auch alle darin enthaltenen
  111.          *  Dateien und Ordner. Vor jeden Pfadnamen in 'files' wird noch
  112.          *  der Pfad 'path' gehängt. Default-Laufwerk und Pfad werden nicht
  113.          *  berücksichtigt.
  114.          *
  115.          *  Eingabeparameter
  116.          *  ----------------
  117.          *
  118.          *    'path'         -- Pfad mit dem alle Dateien beginnen, die
  119.          *                      kopiert werden sollen. Path muß mit ei-
  120.          *                      nem Laufwerk beginnen.
  121.          *    'fileList'     -- Liste aller zu kopierenden Ordner und Da-
  122.          *                      eien. Jedem Listenelement wird noch 'path'
  123.          *                      vorangestellt.
  124.          *    'noFiles'      -- Anzahl der zu kopierenden Ordner und Da-
  125.          *                      teien (kann mit 'CountFilesAndDirs be-
  126.          *                      stimmt werden) oder '0'.
  127.          *    'newPath'      -- Gibt das Ziel des Kopiervorgangs an.
  128.          *    'deleteOld'    -- Wird in der aktuellen Implementation
  129.          *                      noch nicht berücksichtigt. Es sollte
  130.          *                      'FALSE' übergeben werden.
  131.          *    'useAllMem'    -- Gibt an ob der gesamte freie Speicher als
  132.          *                      Kopierpuffer verwendet werden soll oder
  133.          *                      ob nur rund 2/5 genutzt werden (nützlich
  134.          *                      z.B. beim Kopieren in die FlexDisk im
  135.          *                      AUTO-Modus).
  136.          *    'feAlert'      -- Diese Prozedur wird Aufgerufen, sobald
  137.          *                      beim Kopieren eine bereits existierende
  138.          *                      Datei überschrieben werden würde.
  139.          *    'showStatus'   -- Diese Prozedur wird nach jedem vollständi-
  140.          *                      gen Kopieren einer Datei oder eines Ordners
  141.          *                      mit der Anzahl der noch zu kopierenden Da-
  142.          *                      teien aufgerufen und kann den Kopiervor-
  143.          *                      gang durch zurückliefern von 'stop = TRUE'
  144.          *                      abbrechen. Damit die Anzahl richtig ermit-
  145.          *                      telt werden kann darf 'noFiles' nicht mit
  146.          *                      '0' aufgerufen werden.
  147.          *    'fileErrAlert' -- Diese Prozedur wird beim Auftreten eines
  148.          *                      Dateifehlers mit der entsprechenden Fehler-
  149.          *                      nummer aufgerufen.
  150.          *
  151.          *  HINWEIS: Wenn viele Dateien mit einem großen Kopierpuffer ko-
  152.          *           piert werden kann es eine Zeit dauern, bis 'showStatus'
  153.          *           das erste Mal aufgerufen wird, da dann zuerst sehr
  154.          *           viele Dateien gelesen werden und 'showStatus' erst
  155.          *           nach erfolgreichem Schreiben aufgerufen wird.
  156.          *)
  157.  
  158. TYPE    FileInfoProc    = PROCEDURE (VAR (*entry: *) DirEntry);
  159.  
  160. PROCEDURE FileInformation (REF name        : ARRAY OF CHAR;
  161.                                showFileInfo: FileInfoProc;
  162.                                fileErrorAlt: FileErrorAlertProc);
  163.  
  164.         (*  Ruft die Prozedur 'showFileInfo' mit dem zu 'name' gehörenden
  165.          *  Directory-Eintrag auf. Beim Zurückkehren werden alle Veränderungen
  166.          *  im Namen und den Attributen aktualisiert.
  167.          *)
  168.          
  169.  
  170. TYPE    FormatDrive         = [drvA..drvB];
  171.         FormatResult        = (okFR, markedBadFR, failedFR);
  172.  
  173. PROCEDURE FormatDisk (    drive          : FormatDrive;
  174.                           sides,
  175.                           tracks,
  176.                           sectorsPerTrack,
  177.                           interleave     : CARDINAL;
  178.                       REF name           : ARRAY OF CHAR;
  179.                           showStatus     : FileOpStatusProc;
  180.                       VAR result         : FormatResult);
  181.  
  182.         (*  Formatiert eine komplette Diskette in Laufwerk A oder B.
  183.          *  Nach dem Formatieren einer jeden Spur wird 'showStatus'
  184.          *  mit einem Wert (0..'tracks') aufgerufen, der angibt wieviel
  185.          *  Spuren der Diskette (auf jeder Seite) noch formatiert wer-
  186.          *  den müssen. 'result' liefert das Ergebnis der Operation.
  187.          *
  188.          *  Parameter:
  189.          *      'drive'          - Laufwerk auf dem formatiert werden soll
  190.          *                         (nur A: und B: sind erlaubt)
  191.          *      'sides'          - Zu formatierende Seiten (1..2)
  192.          *      'tracks'         - Anzahl der Spuren auf der Diskette
  193.          *                         (Sinnvoll 80..82)
  194.          *      'sectorsPerTrack'- Anzahl der Sektoren pro Spur (9..11)
  195.          *      'interleave'     - Interleave-Faktor (normalerweise 1)
  196.          *      'name'           - Name der Diskette (bis zu 11 Zeichen
  197.          *                         ohne Punkt)
  198.          *
  199.          *  Da die aktuelle Version keine schadhaften Sektoren makiert,
  200.          *  tritt das Ergebnis 'markedBadFR' nicht auf. Es wird statt-
  201.          *  dessen 'failedFR' geliefert um anzuzeigen, daß die Diskette
  202.          *  nicht benutzt werden sollte.
  203.          *
  204.          *  Anmerkung: Diese Routine formatiert eine Diskette ab Spur
  205.          *             'tracks - 1' (norm. 79) abwärts. Bricht man den
  206.          *             Vorgang schnell genug ab, so stehen die Chancen
  207.          *             dafür, daß die wichtigen Daten noch erhalten ge-
  208.          *             blieben sind, gut (Thanks Jörg).
  209.          *
  210.          *  ACHTUNG: Die aktuelle Implementation unterstützt nur das
  211.          *           formatieren von ein- oder zweiseitigen Disketten
  212.          *           mit 9 Sektoren und 80 Spuren.
  213.          *)
  214.  
  215.  
  216. END FileManagement.
  217.